/**
 * 
 */
package matrices;

import java.awt.TextArea;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Vector;

import Jama.Matrix;

/**
 * @author Jose Antonio Gonzalez,Ambrin Chaudhary
 *
 */
public class PruebasCV {

	public static double dist(Matrix m1, Matrix m2)
	{
		double s= 0;
		int n1 = m1.getColumnDimension();
		int n2 = m1.getRowDimension();
		if(n1 > n2)
		{
			double aux = 0;
			double[][] a1 = m1.getArray();
			double[][] a2 = m2.getArray();
			for (int i = 0; i< n1; i++)
			{
				double aux1 = a1[0][i] - a2[0][i];
				aux1 *= aux1;
				aux += aux1;
			}
			s = Math.sqrt(aux);
		}
		else
		{
			double aux = 0;
			double[][] a1 = m1.getArray();
			double[][] a2 = m2.getArray();
			for (int i = 0; i< n2; i++)
			{
				double aux1 = a1[i][0] - a2[i][0];
				aux1 *= aux1;
				aux += aux1;
			}
			s = Math.sqrt(aux);
		}
		
		return s;
	}
	
	/**
	 * @param args
	 * @throws IOException 
	 */
	static String nombreFile  = "C:\\hlocal\\pepe.txt";
	
	//estas es un vector c<on las matrices qeu cargo del fichero de texto
	static Vector<Matrix> vectMatrices =new Vector<Matrix>();
	
	// Este es un vector que contine a su vez vectores de matrices. 
	// Estos vectores de matrices contenidos en el vector vectCentros
	// continen en el primer elemento la descricion del centro 
	// y en las siguientes posiciones las matrices qeu lo componen 
	static Vector<Vector<Matrix>> vectCentros =new Vector<Vector<Matrix>>();
	
	static int T = 20;
	
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		
		try
		{
			File f = new File( nombreFile );
			BufferedReader entrada = new BufferedReader( new FileReader( f ) );
			if ( f.exists() )
			{	
				String s="";
				do {
					s = entrada.readLine();
					if (s == null)
						break;
					else
					{
						StringTokenizer st = new StringTokenizer(s,",");
						
						int i = 0;
						int cant = st.countTokens();
						double d[][] = new double[1][cant];
						while(st.hasMoreTokens())
						{
							
							String s1 = st.nextToken();
							double aux = Double.parseDouble(s1);
							d[0][i] = aux;
							i++;
						}
						
						vectMatrices.add(new Matrix(d));
						
					}
				} while ( true );
			}
			
		} 
		catch (IOException e) {
				// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("Error al cargar archivo"+ nombreFile);
		}  
		
		// ya hemos cargado las matrices en v 
		
		
		double[][] d1 = {{200},{160},{120}};
		double[][] d2 = {{90},{130},{60}};
		for (int i = 0 ; i < vectMatrices.size(); i++)
		{
			Matrix m = vectMatrices.get(i);
			
			if(vectCentros.size() == 0)
			{
				Vector<Matrix> v = new Vector<Matrix>();
				v.add(m);
				Matrix m2 = Matrix.constructWithCopy(m.getArray());
				v.add(m2);
				vectCentros.add(v);
				
			}
			else // no es el primer vector
			{
				int centro = -1;
				double min = Double.MAX_VALUE;
				
				for(int j=0; j<vectCentros.size(); j++)
				{
					Vector<Matrix> v = vectCentros.get(j);
					Matrix mAux = v.get(0);
					double aux = dist(mAux,m);
					min = Math.min(min, aux);
					if(min == aux)
					{
						centro = j;
					}
				}
				
				// vamos a ver si hay que actualizar
				
				if(min <T) // Actualizamos un centro marcado por la var centro
				{
					Vector<Matrix> v = vectCentros.get(centro);
					double d[][] = new double [1][ v.get(0).getColumnDimension()];
					v.add(m);
					for(int h = 1; h<v.size(); h++ )
					{
						Matrix mAux = v.get(h);
						for(int k= 0; k<mAux.getColumnDimension(); k++ )
						{
							d[0][k] += mAux.get(0,k);
						}
						
					}
					int dimMat = v.get(0).getColumnDimension();
					int dimCent = v.size()-1;
					for(int k= 0; k<dimMat; k++ )
					{
						d[0][k] /= dimCent;
					}
					v.set(0, new Matrix(d));
					
					vectCentros.set(centro, v);
					
				}
				else// no hay qeu actualizar --> creamos un nuevo centro
				{
					Vector<Matrix> v = new Vector<Matrix>();
					v.add(m);
					Matrix m2 = Matrix.constructWithCopy(m.getArray());
					v.add(m2);
					vectCentros.add(v);
				}
			}
		}
		
		// con esto el vector ya ha aprendido solo falta ver que nos metes.
		
		Vector<Matrix> mp = vectCentros.get(1);
		int canti = vectCentros.size();
		String s="";
		
		Matrix m1 ;
		m1 = new Matrix(d1);
		
		Matrix x2 = new Matrix(d2);
		
		double sol = dist(x2,m1);
		System.out.print(sol);
	}
	

}
